package com.udistrital.framework.servicio.ejb;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import com.udistrital.framework.adminMenu.DTO.MenuDTO;
import com.udistrital.framework.adminMenu.dao.AmentDao;
import com.udistrital.framework.adminMenu.dao.AmopcDao;
import com.udistrital.framework.adminMenu.dao.AmprfDao;
import com.udistrital.framework.adminMenu.dao.AmusrDao;
import com.udistrital.framework.adminMenu.modelo.Ament;
import com.udistrital.framework.adminMenu.modelo.Amprf;
import com.udistrital.framework.adminMenu.modelo.Amusr;
import com.udistrital.framework.excepcion.AplicacionExcepcion;
import com.udistrital.framework.excepcion.SistemaExcepcion;
import com.udistrital.framework.security.PasswordService;
import com.udistrital.framework.util.UtilDate;

/**
 * Session Bean implementation class AdminMenuEJBean
 */
@Stateless(name = "UDAdminMenuEJBean")
public class AdminMenuEJBean implements AdminMenuEJBeanLocal {
	
	@PersistenceContext(unitName = "UDAdminMenuJPA")
	private EntityManager entityManager;

	//DAOS
	private AmusrDao amusrDao;
	private AmopcDao amopcDao;
//	private CrconDa crconDao;
	private AmprfDao amprfDao;  
	private AmentDao amentDao;
		
    /**
     * Default constructor. 
     */
    public AdminMenuEJBean() {
        // TODO Auto-generated constructor stub
    }
    
    @PostConstruct
	public void init() {
    	amusrDao = new AmusrDao(entityManager);
    	amopcDao = new AmopcDao(entityManager);
    	amprfDao = new AmprfDao(entityManager);
//    	crconDao = new CrconDao(managerASCTCJPA);
	}

	/**
	 * Metodo de login
	 */
    public Amusr login(Amusr amusr) throws AplicacionExcepcion,
			SistemaExcepcion {
    	try{
			amusr = amusrDao.consultarByLogin(amusr);
		} catch (Exception e) {
			throw new SistemaExcepcion(e);
		}
		return amusr;
	}
    /**
     * Metodo de login
     */
    public Amusr loginBD(Amusr amusr) throws AplicacionExcepcion,
    SistemaExcepcion {
    	try {
    		try	{
    			//inicializar PasswordService
//    			ClassLoader classLoader = this.getClass().getClassLoader();
//    			InputStream fileStream = classLoader.getResourceAsStream( "recursos/security.dat" );
//    			PasswordService.init(fileStream);					
//    			amusr.setAuspasCifrado(PasswordService.getInstance().generateMAC(amusr.getAuspas()));
    			amusr = amusrDao.consultarByLoginAndPassword(amusr);
    			
    		}catch(Exception e)
    		{
    			System.out.println(e.getMessage());
    			throw new Exception("login.error.connection");
    		}
    	} catch (Exception e) {
    		throw new SistemaExcepcion(e);
    	}
    	return amusr;
    }
    
    /**
     * Metodo para obtener el menu
     */
    public List<MenuDTO> getMenu(Amusr usuario, int idioma) throws AplicacionExcepcion,SistemaExcepcion {
    	List<MenuDTO> menu = new ArrayList<MenuDTO>();
    	try {
    		//Construccion de Menu
    		
    		//Validacion si el usuario tiene marca especial
    		if(!usuario.getAusesp().equals("S")){
	
	    		// Obtencion de opcione principales
	    		List<MenuDTO> raiz = amopcDao.consultarRegistroMenu(usuario.getAprnom(),  idioma ,0);
	    		if(raiz!= null && raiz.size()>0 ){
	    			for (MenuDTO menuDTO : raiz) {
	    				menu.add(menuDTO);
	    				// Obtencion de opcione hijas de la raiz
	    				List<MenuDTO> opciones =  amopcDao.consultarRegistroMenu(usuario.getAprnom(),  idioma ,menuDTO.getId());
	    				if(opciones!= null && opciones.size()>0 ){
	    					menuDTO.setListSub(opciones);
	    					for (MenuDTO menuOPC : opciones) {
	    						// Obtencion de Subopcione hijas de la opciones
	    						List<MenuDTO> subOpciones = amopcDao.consultarRegistroMenu(usuario.getAprnom(),  idioma ,menuOPC.getId());
	    						if(subOpciones!= null && subOpciones.size()>0 ){
	    							menuOPC.setListSub(subOpciones);
	    						}
	    					}
	    				}
	    			}
	    		}
    		}
    		else{
    			// Obtencion de opcione principales
	    		List<MenuDTO> raiz = amopcDao.consultarALLMenu( idioma ,0);
	    		if(raiz!= null && raiz.size()>0 ){
	    			for (MenuDTO menuDTO : raiz) {
	    				menu.add(menuDTO);
	    				// Obtencion de opcione hijas de la raiz
	    				List<MenuDTO> opciones =  amopcDao.consultarALLMenu( idioma ,menuDTO.getId());
	    				if(opciones!= null && opciones.size()>0 ){
	    					menuDTO.setListSub(opciones);
	    					for (MenuDTO menuOPC : opciones) {
	    						// Obtencion de Subopcione hijas de la opciones
	    						List<MenuDTO> subOpciones = amopcDao.consultarALLMenu(idioma ,menuOPC.getId());
	    						if(subOpciones!= null && subOpciones.size()>0 ){
	    							menuOPC.setListSub(subOpciones);
	    						}
	    					}
	    				}
	    			}
	    		}
    			
    		}
    		
    	} catch (Exception e) {
    		throw new SistemaExcepcion(e);
    	}
    	return menu;
    }

//    /**
//     * Funcion que me retorna la fecha del crcon
//     * */
//    public String encontrarCrcon() throws AplicacionExcepcion, SistemaExcepcion{
//    	String fecha="";
//    	try{
////    	List<Crcon> listCrcon = crconDao.consultarFindAllCrcon();
//    	fecha = UtilDate.FormatFecha(String.valueOf(listCrcon.get(0).getConfph()));
//    	}catch (Exception e) {
//    		throw new SistemaExcepcion();
//    	}
//    	return fecha;
//    }
    /**
     * Funcion que me retorna la hora del sistema
     * */
    public String formatoHora() throws AplicacionExcepcion, SistemaExcepcion{
    	String hora="";
    	try{
    		hora = UtilDate.getHourWithMilliseconds();
    		hora = UtilDate.FormatHoraMilliSecons(hora);
    	}catch (Exception e) {
    		throw new SistemaExcepcion();
    	}
    	return hora;
    }
    
    /**
     * Metodo que retorna todos los perfiles de la biblioteca
     * @return List<Amprf>
     */
    public List<Amprf> consultarTodosPerfiles(){
    	
    	List<Amprf> perfiles = new ArrayList<Amprf>();
    	
    	try {
    		
    		perfiles = (List<Amprf>)amprfDao.consultarTodosRegistros();
			
		} catch (Exception e) {
			throw new SistemaExcepcion(e);
		}
    	return perfiles;
    }

	/**
	 * Consultar todas las entidades
	 */
	public List<Ament> consultarTodasEntidades() throws AplicacionExcepcion,
			SistemaExcepcion {
		
    	List<Ament> registros = new ArrayList<Ament>();
    	
    	try {
    		
    		registros = (List<Ament>)amentDao.consultarTodasEntidades();
			
		} catch (Exception e) {
			throw new SistemaExcepcion(e);
		}
    	return registros;
	}

	/**
	 * Crear un usuario
	 */
	public Amusr crearUsuario(Amusr amusr) throws AplicacionExcepcion,
			SistemaExcepcion {

		try {
			
			//inicializar PasswordService
			ClassLoader classLoader = this.getClass().getClassLoader();
			InputStream fileStream = classLoader.getResourceAsStream( "recursos/security.dat" );
			PasswordService.init(fileStream);	
			amusr.setAuspas(PasswordService.getInstance().generateMAC(amusr.getAuslog()));
			amusrDao.crearRegistro(amusr);
			
		} catch (Exception e) {
			throw new SistemaExcepcion(e);
		}
    	
		return amusr;
    	
	}
	
	
	public List<Amusr> consultarAllUser() throws AplicacionExcepcion, SistemaExcepcion{
		List<Amusr> lista_w = new ArrayList<Amusr>();
		try{
			lista_w = amusrDao.consultarAllAmusr();
		}catch (Exception e) {
			// TODO: handle exception
			throw new SistemaExcepcion();
		}
		return lista_w;
	}
    
}
